#include "stdafx.h"
#include "Vecteur.h"

Vecteur::Vecteur():x(0),y(0),z(0),w(0){}
Vecteur::Vecteur(float x, float y, float z):x(x),y(y),z(z),w(0){}
Vecteur::Vecteur(float c[]):x(c[0]),y(c[1]),z(c[2]),w(0){}
Vecteur::Vecteur(Point p1, Point p2){ 
	x = p2.getX() - p1.getX();
	y = p2.getY() - p1.getY();
	z = p2.getZ() - p1.getZ();
	w= 0;
}

Vecteur::Vecteur(Vecteur const& v)
{
	x = v.x;
	y = v.y;
	z = v.z;
	w = 0;
}

Vecteur::~Vecteur(){}

Vecteur& Vecteur::operator=(Vecteur const& v)
{
	x = v.x;
	y = v.y;
	z = v.z;
	w = 0;

	return *this;
}

Vecteur Vecteur::operator*(Matrice *m)
{
	Vecteur v1;

	v1.x = x*m->getData(0,0) + y*m->getData(1,0) + z*m->getData(2,0);
	v1.y = x*m->getData(0,1) + y*m->getData(1,1) + z*m->getData(2,1);
	v1.z = x*m->getData(0,2) + y*m->getData(1,2) + z*m->getData(2,2);
	v1.w = 0;

	return v1;
}


float Vecteur::getX()
{
	return x;
}

float Vecteur::getY()
{
	return y;
}

float Vecteur::getZ()
{
	return z;
}

void Vecteur::setX(float x1)
{
	x = x1;
}

void Vecteur::setY(float y1)
{
	y = y1;
}

void Vecteur::setZ(float z1)
{
	z = z1;
}

float Vecteur::produitScalaire(Vecteur v)
{
	float produit = 0;

	produit = x*v.x + y*v.y + z* v.z; 

	return produit;
}

Vecteur Vecteur::produitVectoriel(Vecteur v)
{
	Vecteur v1;

	v1.x = y*v.z - z*v.y;
	v1.y = z*v.x - x*v.z;
	v1.z = x*v.y - y*v.x;
	v1.w = 0;

	return v1;
}

Vecteur Vecteur::addition(Vecteur v)
{
	Vecteur v1;

	v1.x = x + v.x;
	v1.y = y + v.y;
	v1.z = z + v.z;
	v1.w = 0;

	return v1;
}

Vecteur Vecteur::operator+(Vecteur v)
{
	return addition(v);
}

Vecteur Vecteur::soustraction(Vecteur v)
{
	Vecteur v1;

	v1.x = x - v.x;
	v1.y = y - v.y;
	v1.z = z - v.z;
	v1.w = 0;

	return v1;
}

Vecteur Vecteur::operator-(Vecteur v)
{
	return soustraction(v);
}

Vecteur Vecteur::operator*(Vecteur v)
{
	Vecteur v1;

	v1.x = x*v.x;
	v1.y = y*v.y;
	v1.z = z*v.z;
	v1.w = 0;

	return v1;
}

Vecteur Vecteur::operator*(float f)
{
	
	x = x*f;
	y = y*f;
	z = z*f;
	w = 0;

	return *this;
}

Vecteur Vecteur::multiplication(float a)
{
	x *= a;
	y *= a;
	z *= a;
	w = 0;

	return *this;
}

float Vecteur::longueur()
{
	float longueur = 0.0f;

	longueur = x*x + y*y + z*z;
	longueur = (float)sqrt(longueur);

	return longueur;
}

void Vecteur::setVecteur(Point p1, Point p2)
{
	x = p2.getX() - p1.getX();
	y = p2.getY() - p1.getY();
	z = p2.getZ() - p1.getZ();
	w= 0;
}

void Vecteur::normalize()
{
	float longueurVec = longueur();

	if(longueurVec)
	{
		x /= longueurVec;
		y /= longueurVec;
		z /= longueurVec;
		w = 0;
	}
	else
	{
		//exception
		x = 0;
		y = 0;
		z = 0;
		w = 0;
	}
}

Vecteur Vecteur::normalisation()
{
	float longueurVec = longueur();

	if(longueurVec)
	{
		x /= longueurVec;
		y /= longueurVec;
		z /= longueurVec;
		w = 0;
	}
	else
	{
		x = 0;
		y = 0;
		z = 0;
		w = 0;
	}

	return *this;
}

float Vecteur::angle(Vecteur v)
{
	float angleV = 0;

	angleV = 1.0f * produitScalaire(v)/(longueur()*v.longueur());
	angleV = acos(angleV)*180.0f/PI;

	return angleV;
}

Vecteur Vecteur::median(Vecteur v){
	Vecteur vecteurMedian((x+v.x)/2,(y+v.y)/2,(z+v.z)/2);
	return vecteurMedian;
}

void Vecteur::inverse()
{
	x = -x;
	y = -y;
	z = -z;
}

std::ostream& Vecteur::display(std::ostream &out) 
{
	out<<"("<<x<<","<<y<<","<<z<<","<<w<<")"<<std::endl;
	return out;
}

std::ostream& operator<<(std::ostream &out,Vecteur v)
{
	return v.display(out);
}

Vecteur Vecteur::rotation(float angle)
{
	

	return *this;
}

Vecteur Vecteur::operator* (Matrice mat) {
	return (Vecteur(mat.getData(0,0) * x + mat.getData(1,0) * y + mat.getData(2,0) * z,
					mat.getData(0,1) * x + mat.getData(1,1) * y + mat.getData(2,1) * z,
					mat.getData(0,2) * x + mat.getData(1,2) * y + mat.getData(2,2)* z));
}